package ongd.negocio.gestion;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Clase que corresponde a la entidad Apadrinado de la base de datos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@Entity
@Table(name = "apadrinado")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Apadrinado.findAll", query = "SELECT a FROM Apadrinado a"),
    @NamedQuery(name = "Apadrinado.findByIdApadrinado", query = "SELECT a FROM Apadrinado a WHERE a.apadrinadoPK.idApadrinado = :idApadrinado"),
    @NamedQuery(name = "Apadrinado.findByNombre", query = "SELECT a FROM Apadrinado a WHERE a.nombre = :nombre"),
    @NamedQuery(name = "Apadrinado.findByApellidos", query = "SELECT a FROM Apadrinado a WHERE a.apellidos = :apellidos"),
    @NamedQuery(name = "Apadrinado.findByDescripcion", query = "SELECT a FROM Apadrinado a WHERE a.descripcion = :descripcion"),
    @NamedQuery(name = "Apadrinado.findByNHermanos", query = "SELECT a FROM Apadrinado a WHERE a.nHermanos = :nHermanos"),
    @NamedQuery(name = "Apadrinado.findByDatosPadres", query = "SELECT a FROM Apadrinado a WHERE a.datosPadres = :datosPadres"),
    @NamedQuery(name = "Apadrinado.findByFechaNacimiento", query = "SELECT a FROM Apadrinado a WHERE a.fechaNacimiento = :fechaNacimiento"),
    @NamedQuery(name = "Apadrinado.findByProyectoidProyecto", query = "SELECT a FROM Apadrinado a WHERE a.apadrinadoPK.proyectoidProyecto = :proyectoidProyecto")})
public class Apadrinado extends Entidad implements Serializable {

    /**
     * Atributo serialVersionUID.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Atributo que corresponde con la clave primaria.
     */
    @EmbeddedId
    protected ApadrinadoPK apadrinadoPK;
    /**
     * Atributo que corresponde con el nombre del apadrinado.
     */
    @Basic(optional = false)
    @Column(name = "Nombre")
    private String nombre;
    /**
     * Atributo que corresponde con los apellidos del apadrinado.
     */
    @Column(name = "Apellidos")
    private String apellidos;
    /**
     * Atributo que corresponde con la descripción del apadrinado.
     */
    @Column(name = "Descripcion")
    private String descripcion;
    /**
     * Atributo que corresponde con el número de hermanos del apadrinado.
     */
    @Column(name = "N_Hermanos")
    private Integer nHermanos;
    /**
     * Atributo que corresponde con los datos de los padres del apadrinado.
     */
    @Column(name = "Datos_Padres")
    private String datosPadres;
    /**
     * Atributo que corresponde con la fecha de nacimiento del apadrinado.
     */
    @Column(name = "Fecha_Nacimiento")
    @Temporal(TemporalType.DATE)
    private Date fechaNacimiento;
    /**
     * Atributo que corresponde con el proyecto al que pertenece el apadrinado.
     */
    @JoinColumn(name = "Proyecto_idProyecto", referencedColumnName = "idProyecto", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Proyecto proyecto;
    /**
     * Atributo que corresponde con la persona (padrino) que está
     * relacionado con el apadrinado.
     */
    @JoinColumn(name = "persona_DNI", referencedColumnName = "DNI")
    @ManyToOne(optional = false)
    private Persona personaDNI;

    /**
     * Constructor de la clase.
     */
    public Apadrinado() {
    }

    /**
     * Contructor de la clase.
     * @param apadrinadoPK Clave primaria que tendrá el apadrinado
     */
    public Apadrinado(ApadrinadoPK apadrinadoPK) {
        this.apadrinadoPK = apadrinadoPK;
    }

    /**
     * Constructo de la clase.
     * @param apadrinadoPK Clave primaria
     * @param nombre Nombre del apadrinado
     */
    public Apadrinado(ApadrinadoPK apadrinadoPK, String nombre) {
        this.apadrinadoPK = apadrinadoPK;
        this.nombre = nombre;
    }

    /**
     * Constructor de la clase.
     * @param idApadrinado Id del apadriando
     * @param proyectoidProyecto Proyecto al que pertenece
     */
    public Apadrinado(int idApadrinado, int proyectoidProyecto) {
        this.apadrinadoPK = new ApadrinadoPK(idApadrinado, proyectoidProyecto);
    }

    /**
     * Método que devuelve la clave primaria.
     * @return apadrinadoPK
     * @see #setApadrinadoPK
     */
    public ApadrinadoPK getApadrinadoPK() {
        return apadrinadoPK;
    }

    /**
     * Método que establece la clave primaria.
     * @param apadrinadoPK Nuevo valor de la variable
     * @see #getApadrinadoPK
     */
    public void setApadrinadoPK(ApadrinadoPK apadrinadoPK) {
        this.apadrinadoPK = apadrinadoPK;
    }

    /**
     * Método que devuelve el nombre.
     * @return nombre 
     * @see #setNombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Método que establece el nombre.
     * @param nombre Nuevo valor de la variable
     * @see #getNombre
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Método que devuelve el campo apellidos.
     * @return apellidos
     * @see #setApellidos
     */
    public String getApellidos() {
        return apellidos;
    }

    /**
     * Método que establece los apellidos.
     * @param apellidos Nuevo valor de la variable
     * @see #getApellidos
     */
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    /**
     * Método que devuelve la descripción.
     * @return descripcion
     * @see #setDescripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * Método que establece la descripción.
     * @param descripcion Nuevo valor de la variable
     * @see #getDescripcion
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * Método que devuelve el número de hermanos.
     * @return nHermanos
     * @see #setNHermanos
     */
    public Integer getNHermanos() {
        return nHermanos;
    }

    /**
     * Método que establece el número de hermanos.
     * @param nHermanos Nuevo valor de la variable
     * @see #getNHermanos
     */
    public void setNHermanos(Integer nHermanos) {
        this.nHermanos = nHermanos;
    }

    /**
     * Método que devuelve los datos de los padres.
     * @return datosPadres
     * @see #setDatosPadres
     */
    public String getDatosPadres() {
        return datosPadres;
    }

    /**
     * Método que establece los datos de los padres.
     * @param datosPadres Nuevo valor de la variable
     * @see #getDatosPadres
     */
    public void setDatosPadres(String datosPadres) {
        this.datosPadres = datosPadres;
    }

    /**
     * Método que devuelve la fecha de nacimiento.
     * @return fechaNacimiento
     * @see #setFechaNacimiento
     */
    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    /**
     * Método que establece la fecha de nacimiento.
     * @param fechaNacimiento Nuevo valor de la variable
     * @see #getFechaNacimiento
     */
    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    /**
     * Método que devuelve el proyecto.
     * @return proyecto
     * @see #setProyecto
     */
    public Proyecto getProyecto() {
        return proyecto;
    }

    /**
     * Método que establece el proyecto.
     * @param proyecto Nuevo valor de la variable
     * @see #getProyecto
     */
    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    /**
     * Método que devuelve el padrino.
     * @return personaDni
     * @see #setPersonaDNI
     */
    public Persona getPersonaDNI() {
        return personaDNI;
    }

    /**
     * Método que establece el padrino.
     * @param personaDNI Nuevo valor de la variable
     * @see #getPersonaDNI
     */
    public void setPersonaDNI(Persona personaDNI) {
        this.personaDNI = personaDNI;
    }
    
    /**
     * Método que indica si un apadrinado está siendo apadrinado.
     * @return true o false en funcion de si lo está o no
     */
    public boolean estaApadrinado() {
        //Si el dni de la persona es nulo implica que no esta apadrinado.
        if (personaDNI == null) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Método que devuelve un número con una propiedad fundamental, si dos 
     * objetos son iguales el valor retornado por sus respectivos hashCode 
     * debe ser igual.
     * @return hash
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (apadrinadoPK != null ? apadrinadoPK.hashCode() : 0);
        return hash;
    }

    /**
     * Método que compara si dos apadrinados son iguales.
     * @param object Objeto a comparar
     * @return true o false
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Apadrinado)) {
            return false;
        }
        Apadrinado other = (Apadrinado) object;
        if ((this.apadrinadoPK == null && other.apadrinadoPK != null) || (this.apadrinadoPK != null && !this.apadrinadoPK.equals(other.apadrinadoPK))) {
            return false;
        }
        return true;
    }

    /**
     * Método que devuelve una cadena con el apadrinado.
     * @return string
     */
    @Override
    public String toString() {
        return "ongd.negocio.entidades.Apadrinado[ apadrinadoPK=" + apadrinadoPK + " ]";
    }    
}
